home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_100 / 111_01 / crck4.asm < prev    next >
Assembly Source File  |  1985-08-19  |  12KB  |  564 lines

  1.  
  2. ;
  3. ;        CRCK.ASM version 4.2B
  4. ;          by Keith Petersen, W8SDZ
  5. ;        (REVISED 4/27/ BY BRK)
  6. ;
  7. ;----> NOTE: MUST BE ASSEMBLED BY MAC <----
  8. ;
  9. ;CRCK is a program to read any CP/M file and print
  10. ;a CYCLIC-REDUNDANCY-CHECK number based on the
  11. ;CCITT standard polynominal:
  12. ;   X^16 + X^15 + X^13 + X^7 + X^4 + X^2 + X + 1
  13. ;
  14. ;Useful for checking accuracy of file transfers.
  15. ;More accurate than a simple checksum.
  16. ;
  17. ;Optionally will write an output file to the default
  18. ;drive, listing the CRC's of all files checked in a
  19. ;single session.
  20. ;
  21. ;COMMANDS:   CRCK [drive:]<filename.filetype> [F]
  22. ;
  23. ;Examples:
  24. ;    CRCK MYFILE.ASM    ;CHECK ONLY MYFILE.ASM
  25. ;    CRCK *.ASM    ;CHECK ALL .ASM FILES
  26. ;    CRCK *.* F    ;CHECK ALL FILES, MAKE FILE OF RESULTS
  27. ;
  28. ;Program updates/fixes (these are written in reverse
  29. ;order to minimize reading time to find latest update):
  30. ;
  31. ;4/27/81  ADDED SUM OF CRC PRINTOUT AT END OF EXECUTION (BRK)
  32. ;
  33. ;10/06/80 FIX TO ERASE TEMPORARY FILE WHEN OUTPUT FILE IS
  34. ;      REQUESTED AND NAME NOT FOUND IN DIRECTORY. (KBP)
  35. ;
  36. ;10/05/80 FIX ABORT ROUTINE TO CHECK FOR FILE REQUEST
  37. ;      AND TO CLOSE INCOMPLETE FILE BEFORE ERASING
  38. ;      IT. ADDED TESTS FOR NO FILE NAME AND FILE
  39. ;      READ ERROR.  (KBP)
  40. ;
  41. ;10/04/80 ADD ROUTINE TO GIVE OPTION TO MAKE
  42. ;      DISK FILE OF CRC's. FIXED MFA ROUTINE
  43. ;      SO FIRST-TIME FLAG NOW SHOWS IF NO FILE
  44. ;      FOUND.  (KBP)
  45. ;
  46. ;04/21/80 ADD MULTIPLE FILENAME FEATURE, PRINT
  47. ;      NAME OF CURRENT FILE BEING READ, AND
  48. ;      ALLOW OPERATOR ABORT. (KBP)
  49. ;
  50. ;08/20/79 FIX BUG IN READIT ROUTINE WHICH
  51. ;      SHOWED UP ONLY ON ALTCPM OPTION. (KBP)
  52. ;
  53. ;08/19/79 ADD CONDITIONAL ASSEMBLY FOR CP/M
  54. ;      ON H8 OR TRS-80.  (KBP)
  55. ;
  56. ;06/27/79 FIRST WRITTEN BY KEITH PETERSEN, W8SDZ
  57. ;
  58. ;Define true and false
  59. ;
  60. FALSE    EQU    0
  61. TRUE    EQU    NOT FALSE
  62. ;
  63. ;Conditional assembly switches
  64. ;
  65. STDCPM    EQU    TRUE    ;TRUE IS STANDARD CP/M
  66. ALTCPM    EQU    FALSE    ;TRUE IS H8 OR TRS-80
  67. NOSYS    EQU    FALSE    ;TRUE IF SYS FILES NOT WANTED
  68. ;
  69. ;System equates
  70. ;
  71. BASE    SET    0
  72.     IF    ALTCPM
  73. BASE    SET    4200H
  74.     ENDIF        ;ALTCPM
  75. ;
  76. ;Define write buffer size (presently set for 8k)
  77. ;
  78. BSIZE    EQU    8*1024    ;DISK WRITE BUFFER SIZE
  79. ;
  80. ;BDOS equates
  81. ;
  82. RDCON    EQU    1
  83. WRCON    EQU    2
  84. PRINT    EQU    9
  85. CSTAT    EQU    11
  86. OPEN    EQU    15
  87. SRCHF    EQU    17
  88. SRCHN    EQU    18
  89. READ    EQU    20
  90. STDMA    EQU    26
  91. BDOS    EQU    BASE+5
  92. FCB    EQU    BASE+5CH
  93. FCBEXT    EQU    FCB+12
  94. FCBRNO    EQU    FCB+32
  95. FCB2    EQU    BASE+6CH
  96. ;
  97. ;Program starts here
  98. ;
  99.     ORG    BASE+100H
  100. ;
  101.     MACLIB    SEQIO    ;DEFINE MACRO LIBRARY USED
  102. ;
  103. CRCK:    JMP    BEGIN    ;JUMP AROUND IDENTIFICATION
  104.     DB    'CRCK.COM 4.2B 4/27/81'
  105. ;
  106. BEGIN:    LXI    H,0    ;GET STACK...
  107.     SHLD    SUM    ; INIT CRC SUM COUNTER
  108.     DAD    SP    ;POINTER SO WE CAN...
  109.     SHLD    STACK    ;SAVE IT
  110.     LXI    SP,STACK ;INITIALIZE LOCAL STACK
  111.     CALL    CRLF    ;TURN UP A NEW LINE
  112.     LDA    FCB+1
  113.     CPI    ' '    ;SEE IF NAME THERE
  114.     JNZ    BEGIN2    ;YES, CONTINUE
  115.     CALL    ERXIT    ;PRINT MSG, THEN EXIT
  116.     DB    '++NO FILE NAME SPECIFIED++',CR,LF,'$'
  117. ;
  118. BEGIN2:    CALL    ILPRT    ;PRINT:
  119.     DB    'CRCK ver 4.2B',CR,LF
  120.     DB    'CTL-S pauses, CTL-C aborts',CR,LF,0
  121.     LDA    FCB2+1    ;GET OPTION
  122.     STA    FFLAG    ;SAVE IT FOR LATER
  123.     CPI    'F'    ;FILE WANTED?
  124.     JNZ    AGAIN    ;NO, SKIP FILE INIT
  125. ;
  126. ;'Declare' FCB for output file
  127. ;(temporarily named CRCKLIST.$$$)
  128. ;
  129.     FILE    OUTFILE,CRCFILE,,CRCKLIST,$$$,BSIZE
  130. ;
  131. AGAIN:    LXI    SP,STACK ;RE-INIT STACK POINTER
  132.     CALL    MFNAME    ;SEARCH FOR NAMES
  133.     JNC    NAMTST    ;ANOTHER FOUND, PRINT NAME
  134.     LDA    MFFLG1    ;NOTHING FOUND, CHECK...
  135.     ORA    A    ;... FIRST TIME FLAG
  136.     JZ    DONE    ;AT LEAST ONE WAS FOUND
  137.     CALL    ABEXIT    ;PRINT MSG, THEN EXIT
  138.     DB    '++FILE NOT FOUND++$'
  139. ;
  140. DONE:
  141.     CALL    ILPRT    ;PRINT "SUM OF CRC:"
  142.     DB    CR,LF,' ---------------------> SUM OF CRCS = ',0
  143.     LDA    SUM+1    ; GET MSB
  144.     CALL    HEXO
  145.     MVI    A,' '
  146.     CALL    TYPE
  147.     LDA    SUM    ; GET LSB
  148.     CALL    HEXO
  149.     CALL    CRLF
  150.     LDA    FFLAG    ;SEE IF WE'RE MAKING FILE
  151.     CPI    'F'
  152.     JNZ    DONE2    ;NO, SKIP THE FILE STUFF
  153. ;
  154. ;Close CRCKLIST.$$$
  155.     FINIS    CRCFILE
  156. ;
  157. ;Build FCB for final name of CRCKLIST.CRC
  158.     FILE    SETFILE,FINAL,,CRCKLIST,CRC
  159. ;
  160. ;Erase any existing old file
  161.     ERASE    FINAL
  162. ;
  163. ;Rename CRCKLIST.$$$ to CRCKLIST.CRC
  164.     RENAME    FINAL,CRCFILE
  165. ;
  166. ;Now exit to CP/M
  167. DONE2:    CALL    MSGEXIT    ;PRINT DONE, THEN EXIT
  168.     DB    CR,LF,'DONE$'
  169. ;
  170. ;Test for names to ignore
  171. ;
  172. NAMTST:    IF    NOSYS
  173.     LDA    FCB+10    ;GET SYS ATTRIBUTE
  174.     ANI    80H    ;IS IT SYS?
  175.     JNZ    AGAIN    ;YES, IGNORE THIS FILE
  176.     ENDIF        ;NOSYS
  177. ;
  178. ;Ignore files with .$$$ filetype (they are usually
  179. ;zero-length and clutter up our display.  We also
  180. ;want to ignore our own CRCKLIST.$$$ temporary file).
  181. ;
  182.     LXI    H,FCB+9    ;POINT TO FILETYPE IN FCB
  183.     CALL    TSTBAD    ;CHECK FOR .$$$ FILES
  184.     JZ    AGAIN    ;IF ZERO FLAG, IGNORE THEM
  185. ;
  186. ;Move 8 characters from FCB+1 to FNAME
  187.     LXI    H,FCB+1
  188.     LXI    D,FNAME
  189.     LXI    B,8
  190.     CALL    MOVER
  191. ;Move 3 characters from FCB+9 to FNAME+9
  192.     LXI    H,FCB+9
  193.     LXI    D,FNAME+9
  194.     LXI    B,3
  195.     CALL    MOVER
  196. ;Now print filename.type
  197.     CALL    ILPRT    ;PRINT:
  198.     DB    CR,LF,'--> FILE:  '
  199. FNAME:    DB    'XXXXXXXX.XXX',TAB,TAB,'CRC = ',0
  200. ;
  201. ;Open the file
  202.     LXI    D,FCB
  203.     MVI    C,OPEN
  204.     CALL    BDOS
  205.     INR    A
  206.     JNZ    RDINIT
  207.     CALL    ABEXIT
  208.     DB    '++OPEN FAILED++$'
  209. ;
  210. ;Initialize CRC to zero and set BUFAD to cause initial read
  211. RDINIT:    LXI    H,0
  212.     SHLD    REM    ;INIT REMAINDER TO ZERO
  213.     LXI    H,BASE+100H
  214.     SHLD    BUFAD    ;INIT BUFFER ADRS
  215. ;
  216. ;This is the read loop
  217. READIT:    LHLD    BUFAD
  218.     MOV    A,H    ;TIME TO READ?
  219.     CPI    BASE SHR 8
  220.     JZ    NORD    ;NO READ
  221.     MVI    C,CSTAT
  222.     CALL    BDOS    ;CHECK FOR OPERATOR ABORT
  223.     ORA    A
  224.     JZ    READ2    ;NOTHING FROM OPERATOR
  225.     MVI    C,RDCON
  226.     CALL    BDOS    ;GET CHARACTER INPUTTED
  227.     CPI    'C'-40H    ;CONTROL C?
  228.     JZ    ABEXT2    ;YES EXIT
  229. ;
  230. READ2:    LXI    D,FCB
  231.     MVI    C,READ    ;READ ANOTHER SECTOR OF FILE
  232.     CALL    BDOS
  233.     ORA    A    ;CHECK RETURN CODE
  234.     JNZ    FINISH    ;ERROR OR EOF
  235.     LXI    H,BASE+80H ;BUFFER LOCATION
  236. ;
  237. NORD:    MOV    A,M    ;GET FILE CHARACTER
  238.     STA    MESS    ;SAVE FOR DIVP
  239.     INX    H
  240.     SHLD    BUFAD    ;UPDATE BUFFER ADR
  241.     CALL    DIVP    ;CALCULATE NEW CRC
  242.     JMP    READIT    ;GO READ MORE CHARACTERS
  243. ;
  244. FINISH:    CPI    1    ;NORMAL END-OF-FILE?
  245.     JNZ    FILERR    ;NO, IT WAS A READ ERROR
  246.     LDA    REM+1    ;GET MSP OF CRC
  247.     CALL    HEXO    ;PRINT IT
  248.     MVI    A,' '
  249.     CALL    TYPE    ;TYPE A SPACE
  250.     LDA    REM    ;GET LSP OF CRC
  251.     CALL    HEXO    ;PRINT IT
  252.     CALL    CRLF    ;TURN UP NEW LINE
  253.     LHLD    REM    ; GET PRESENT CRC
  254.     XCHG
  255.     LHLD    SUM    ; GET RUNNING SUM
  256.     DAD    D    ; ADD THEM
  257.     SHLD    SUM    ; SAVE BACK IN BUFFER
  258.     JMP    AGAIN    ;SEE IF MORE FILES TO DO
  259. ;
  260. FILERR:    CALL    ABEXIT    ;ABORT BECAUSE OF FILE READ ERROR
  261.     DB    '++FILE READ ERROR++$'
  262. ;
  263. ;---------------------------------------------
  264. ;An 8080 routine for generating a CYCLIC-
  265. ;REDUNDANCY-CHECK.  Character leaves that
  266. ;character in location REM.  By Fred Gutman.
  267. ;From 'EDN' magazine, June 5, 1979 issue, page 84.
  268. ;
  269. DIVP:    LHLD    REM    ;GET REMAINDER
  270.     MOV    A,H
  271.     ANI    128    ;Q-BIT MASK
  272.     PUSH    PSW    ;SAVE STATUS
  273.     DAD    H    ;2 X R(X)
  274.     LDA    MESS    ;MESSAGE BIT IN LSB
  275.     ADD    L
  276.     MOV    L,A
  277.     POP    PSW
  278.     JZ    QB2    ;IF Q-BIT IS ZERO
  279. ;
  280. QB:    MOV    A,H
  281.     XRI    0A0H    ;MS HALF OF GEN. POLY
  282.     MOV    H,A
  283.     MOV    A,L
  284.     XRI    97H    ;LS HALF OF GEN. POLY
  285.     MOV    L,A
  286. ;
  287. QB2:    SHLD    REM
  288.     RET
  289. ;--------------------------------------------
  290. ;
  291. ;Hex output
  292. ;
  293. HEXO:    PUSH    PSW    ;SAVE FOR RIGHT DIGIT
  294.     RAR        ;RIGHT..
  295.     RAR        ;..JUSTIFY..
  296.     RAR        ;..LEFT..
  297.     RAR        ;..DIGIT..
  298.     CALL    NIBBL    ;PRINT LEFT DIGIT
  299.     POP    PSW    ;RESTORE RIGHT
  300. ;
  301. NIBBL:    ANI    0FH    ;ISOLATE DIGIT
  302.     CPI    10    ;IS IS <10?
  303.     JC    ISNUM    ;YES, NOT ALPHA
  304.     ADI    7    ;ADD ALPHA BIAS
  305. ;
  306. ISNUM:    ADI    '0'    ;MAKE PRINTABLE
  307.     JMP    TYPE    ;PRINT IT, THEN RETURN
  308. ;
  309. ;Inline print routine
  310. ;
  311. ILPRT:    XTHL        ;SAVE HL, GET MSG
  312. ;
  313. ILPLP:    MOV    A,M    ;GET CHAR
  314.     CALL    TYPE    ;OUTPUT IT
  315.     INX    H    ;POINT TO NEXT
  316.     MOV    A,M    ;TEST
  317.     ORA    A    ;..FOR END
  318.     JNZ    ILPLP
  319.     XTHL        ;RESTORE HL, RET ADDR
  320.     RET        ;RET PAST MSG
  321. ;
  322. ;Send carriage return, line feed to output
  323. ;
  324. CRLF:    MVI    A,CR    ;CARRIAGE RETURN
  325.     CALL    TYPE
  326.     MVI    A,LF    ;LINE FEED, FALL INTO 'TYPE'
  327. ;
  328. ;Send character in A register to output
  329. ;
  330. TYPE:    PUSH    B
  331.     PUSH    D
  332.     PUSH    H
  333.     ANI    7FH    ;STRIP PARITY BIT
  334.     MOV    E,A
  335.     PUSH    D
  336.     CALL    WRFILE    ;WRITE TO FILE IF REQUESTED
  337.     POP    D
  338.     MVI    C,WRCON    ;SEND CHARACTER TO CONSOLE
  339.     CALL    BDOS
  340.     POP    H
  341.     POP    D
  342.     POP    B
  343.     RET
  344. ;
  345. ;Write character in E register to output file
  346. ;
  347. WRFILE:    LDA    FFLAG    ;GET FILE TRIGGER
  348.     CPI    'F'    ;IS IT SET?
  349.     RNZ        ;NO, RETURN
  350.     MOV    A,E    ;GET CHARACTER BACK
  351.     PUT    CRCFILE ;SEND IT TO THE FILE
  352.     RET
  353. ;
  354. ;Multi-file access subroutine.  Allows processing
  355. ;of multiple files (i.e. *.ASM) from disk.  This
  356. ;routine builds the proper name in the FCB each
  357. ;time it is called. Ca